from statsmodels.stats.contingency_tables import mcnemar
from sklearn.datasets import load_iris  # 鸢尾花数据集（经典分类任务）
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier  # 两个待对比的模型

# 1. 加载数据（固定任务，确保结果可复现）
iris = load_iris()
X, y = iris.data, iris.target  # 特征：150个样本×4个特征；标签：3分类（山鸢尾、变色鸢尾、维吉尼亚鸢尾）

# 初始化模型
model_a = RandomForestClassifier(random_state=42)
model_b = GradientBoostingClassifier(random_state=42)

# 得到两模型的预测结果
y_pred_a = model_a.fit(X, y).predict(X)  # 注意：实际中要用独立测试集！
y_pred_b = model_b.fit(X, y).predict(X)

# 构建列联表：[[都对, A错B对], [A对B错, 都错]]
table = [
    [sum((y_pred_a == y) & (y_pred_b == y)),  # 都对
     sum((y_pred_a != y) & (y_pred_b == y))], # A错B对
    [sum((y_pred_a == y) & (y_pred_b != y)),  # A对B错
     sum((y_pred_a != y) & (y_pred_b != y))]  # 都错
]

# 执行McNemar检验（小样本用exact=True）
result = mcnemar(table, exact=True)

print(f"列联表: {table}")
print(f"精确检验p值: {result.pvalue:.5f}")